package java9;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;

public class Java9Sample {

    public static void main(String[] args) {
        // =================================
        // 1. 创建不可变集合, 只读, 不可添加、删除、排序等
        // =================================
        List<Integer> list = List.of(1, 3, 2, 1);
        // Set.of 元素不能重复, 否则抛出异常
        Set<Integer> set = Set.of(1, 3, 2, 4);
        // Map.of Key不能重复, 否则抛出异常
        Map<String, Integer> map = Map.of("Annie", 20, "Cindy", 18);
        // =================================
        // 2. 流操作
        // =================================
        // 允许创建空的流
        Stream<Object> nullStream = Stream.ofNullable(null);
        // ===> 空
        nullStream.forEach(System.out::println);
        // 丢弃满足条件的元素, 直到第一个不满足条件的为止
        // ===> 3, 4
        Stream<Integer> dropStream = Stream.of(1, 2, 3, 4).dropWhile(i -> i < 3);
        // 获取满足条件的元素, 直到第一个不满足条件的为止
        // ===> 1, 2
        Stream<Integer> takeStream = Stream.of(1, 2, 3, 4).takeWhile(i -> i < 3);
        // =================================
        // 3. Optional
        // =================================
        Optional<String> strOptional = Optional.empty();
        // ifPresentOrElse(Consumer, Runnable) 如果存在则执行Consumer, 否则执行Runnable
        strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Cindy"));
        // 如果不存在则执行参数函数返回
        // or 与 orElseGet 区别: orElseGet提供对象实例, or提供的是对象实例的Optional类型
        strOptional = strOptional.or(() -> Optional.of("Cindy"));
        // 转 stream 流
        Stream<String> optStream = strOptional.stream();
    }

    // 接口可以声明私有方法
    public interface IFace {

        private void face() {

        }

    }

}